package com.dmyang.common;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by brss on 2018/3/23.
 */
public class DynamicDataSourceHolder {

    /**
     * 给每一个线程都会持有一个ThreadLocal ，它里面装的是：尖括号里填写的类型 的数据
     */
    public static final ThreadLocal<String> holder = new ThreadLocal<>();

    /**
     * 多个线程公用一个数据的时候，需要特别小心。
     */
    private static AtomicInteger counter = new AtomicInteger(-1);

    //写库对应的数据源key
    private static final String MASTER = "master";
    //读库对应的数据源key
    private static final String SLAVE_1 = "slave_1";
    private static final String SLAVE_2 = "slave_2  ";

    public static void setDataSource(DataSourceType dataSourceType){
        if(dataSourceType==DataSourceType.MASTER){
            System.out.println("===============MASTER==================");
            holder.set(MASTER);
        }else if (dataSourceType == DataSourceType.SLAVE){
            //轮询从机
            holder.set(roundRobinSlaveKey());
        }
    }

    public static String getDataSource(){
        return holder.get();
    }

    /**
     * 轮询算法，让两台从机轮换地工作
     * @return
     */
    private static String roundRobinSlaveKey() {
        //获取和新增是一个原子的过程，要么两个操作都成功，要么两个操作都失败。
        Integer index = counter.incrementAndGet() % 2;
        if (counter.get()>9999){
            counter.set(-1);
        }
        if(index==0){
            System.out.println("===============SLAVE_1==================");
            return SLAVE_1;
        }else {
            System.out.println("===============SLAVE_2==================");
            return SLAVE_2;
        }
    }


}
